package com.ww.java.generic.method.erase;

/**
 * 有时必须通过引入类型标签来对擦除进行补偿。这意味着你需要显式地传递你的类型的Class对象
 * 以便你可以在类型表达式中使用它。
 * @param <T>
 */
public class ClassTypeCapture<T> {

	Class<T> kind;
	
	public ClassTypeCapture(Class<T> kind) {
		this.kind = kind;
	}
	
	/**
	 * 编译器将确保类型标签可以匹配泛型参数
	 * @param arg
	 * @return
	 */
	public boolean f(Object arg) {
		// 具体来说，如果类对象表示一个声明的类，
		// 如果指定的Object参数是所表示的类（或其任何子类）的实例，
		// 则此方法返回true ; 它返回false其他
		return kind.isInstance(arg);
	}
	
	public static void main(String[] args) {
		ClassTypeCapture<Building> ctt1 = new ClassTypeCapture<>(Building.class);
		// true
		System.out.println(ctt1.f(new Building()));
		// true
		System.out.println(ctt1.f(new House()));
		
		ClassTypeCapture<House> ctt2 = new ClassTypeCapture<>(House.class);
		// false
		System.out.println(ctt2.f(new Building()));
		// true
		System.out.println(ctt2.f(new House()));
	}
}

class Building {}

class House extends Building {}
